package main

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/olivere/elastic"
	"reflect"
)

//指定id查询
func find(id string) {
	res, err := client.Get().Index(indexName).Type(typeName).Id(id).Do(context.Background())
	if err != nil {
		fmt.Printf("查询数据出错 %v\n", err)
		return
	}
	err = json.Unmarshal(*res.Source, &ttype)
	if err != nil {
		fmt.Printf("反射转换出错 %v\n", err)
		return
	}
	fmt.Println(ttype)
}

//增
func add(user User) {
	res, err := client.Index().Index(indexName).Type(typeName).BodyJson(user).Do(context.Background())
	//如果不指定id就会随机生成id
	if err != nil {
		fmt.Printf("往索引里插入数据出错 %v\n", err)
		return
	}
	fmt.Println(res)
}

//指定id删除
func del(id string) {
	res, err := client.Delete().Index(indexName).Type(typeName).Id(id).Do(context.Background())
	if err != nil {
		fmt.Printf("往索引里删除数据出错 %v\n", err)
		return
	}
	fmt.Println(res)
}

//指定id更新
func update(id string) {
	res, err := client.Update().Index(indexName).Type(typeName).Id(id).Do(context.Background())
	if err != nil {
		fmt.Printf("往索引里更新数据出错 %v\n", err)
		return
	}
	fmt.Println(res)
}

//有条件查询 不过会对搜索词分词 还是按照匹配度返回查询结果
func findWithCondition() {
	query := elastic.NewQueryStringQuery("Name:周杨")
	q := elastic.NewBoolQuery().Must(query)
	res, err := client.Search(indexName).Type(typeName).Query(q).Do(context.Background())
	if err != nil {
		fmt.Printf("查询数据出错 %v\n", err)
		return
	}
	fmt.Printf("共查询到%d个数据\n", res.TotalHits())
	for _, item := range res.Each(reflect.TypeOf(ttype)) {
		obj := item.(User)
		fmt.Printf("%v\n", obj)
	}
}

//高亮查询
func findWithHighLight() {
	var highlight *elastic.Highlight = elastic.NewHighlight()
	highlight.Field("Des")
	highlight.FragmentSize(20)

	query := elastic.NewBoolQuery().Should(elastic.NewMatchPhraseQuery("Des", "华中科技大学"))
	res, err := client.Search(indexName).Type(typeName).Query(query).Highlight(highlight).Do(context.Background())
	if err != nil {
		fmt.Printf("高亮查询出错 %v\n", err)
		return
	}
	for _, item := range res.Each(reflect.TypeOf(ttype)) {
		obj := item.(User)
		fmt.Printf("%v\n", obj)
	}
	//高亮片段被封装在hints中
}
